package es.uma.scgt.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import es.uma.scgt.dao.EquipoDao;
import es.uma.scgt.dao.PeticionDao;
import es.uma.scgt.modelo.Equipo;
import es.uma.scgt.modelo.FaseP;
import es.uma.scgt.modelo.Peticion;
import es.uma.scgt.modelo.Usuario;

public class PeticionDaoJpa implements PeticionDao {
	@Autowired 
	private SessionFactory session;
	
	@Autowired
	private EquipoDao equipoDao;
	

	public void peticionBorrador(Peticion tmpPeticion) {
		tmpPeticion.setFase(FaseP.B);	
		session.getCurrentSession().saveOrUpdate(tmpPeticion);
	}

	public void peticionEnviar(Peticion tmpPeticion) {
		session.getCurrentSession().saveOrUpdate(tmpPeticion);
		
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Peticion> getBorradores(){
		return session.getCurrentSession().createQuery("from Peticion e where e.fase = '" + FaseP.B.toString()+"'").list();
	}
	
	@SuppressWarnings("unchecked")
	public List<Peticion> getEnviadas(){
		return session.getCurrentSession().createQuery("from Peticion e where e.fase = '" + FaseP.E.toString()+"'").list();
	}
	
	@SuppressWarnings("unchecked")
	public List<Peticion> getEnProceso(){
		return session.getCurrentSession().createQuery("from Peticion e where e.fase = '" + FaseP.P.toString()+"'").list();
	}
	
	@SuppressWarnings("unchecked")
	public List<Peticion> getFinalizadas(){
		return session.getCurrentSession().createQuery("from Peticion e where e.fase = '" + FaseP.F.toString()+"'").list();
	}
	
	public Peticion encuentraPeticionPorId(int peticionId){
		return (Peticion)session.getCurrentSession().get(Peticion.class,peticionId);
		
	}
	
	@Transactional
	public void BorrarPeticion (int peticionId){
		Peticion p = encuentraPeticionPorId(peticionId);
		session.getCurrentSession().delete(p);
	}
	
	public List<Peticion> pEquiposxUsuario(List<Equipo> listaEquipos) {
		List<Integer> equiposId = new ArrayList<Integer>();
		// coger los Ids de los equipos
		for (Equipo item : listaEquipos) {
			equiposId.add(item.getId());
		}
		
		// Dame los usuarios por equipo
		List<Integer> usuariosDeQuipo = equipoDao.usuariosXEquipo(equiposId);
		
		
		List<Usuario> usuarios = new ArrayList<Usuario>();
		for (Integer id : usuariosDeQuipo) {
			Usuario nuevoUsuario = new Usuario();
			nuevoUsuario.setId(id);
			usuarios.add(nuevoUsuario);
		}
		
		List<Peticion> listPeticiones = null;
		try{
			@SuppressWarnings("unchecked")
			List<Peticion>  t=  (List<Peticion>) session.getCurrentSession().createQuery("from Peticion p where p.emisor in (:listaUsuario) and (p.fase = '"+ FaseP.E.toString()+"' or p.fase = '"+ FaseP.P.toString()+"')").setParameterList("listaUsuario", usuarios).list();
			listPeticiones = t;
		}catch(Exception e){
			e.printStackTrace();
		}
				
		
		return listPeticiones;
	}
	
	@SuppressWarnings("unchecked")
	public List<Peticion> getPeticionesMiEquipo(List<Equipo> listaEquipo){
		//A�adirle el filtro solo peticiones P and E 
		return session.getCurrentSession().createQuery("select distinct p from Peticion p LEFT JOIN FETCH p.tareas where p.receptor in (:listaEquipo) and p.fase = '" + FaseP.E.toString()+"'").setParameterList("listaEquipo", listaEquipo).list();
	}

	
	
	

	
}
